﻿package  {
	import flash.display.MovieClip;
	import flash.geom.Point;
	
	public class Piece extends MovieClip
	{
		var pieceColor:String;
		var row:int;
		var column:int;
		var alive:Boolean; // Diz se a peça está no tabuleiro ou não.
		var positions:Array;
		var currentBoard:Array;
		var firstMove:Boolean;
		
		public function Piece(pieceColor:String, currentRow:int, currentColumn:int) 
		{
			this.pieceColor = pieceColor;
			this.row = currentRow;
			this.column = currentColumn;
			this.alive = true;
			setPosition();
			setFrame();
		}
		
		// Seta a posição da peça no tabuleiro.
		public function setPosition():void
		{
			this.x = Board.squareSize/2 + (this.column * Board.squareSize);
			this.y = Board.squareSize/2 + (this.row * Board.squareSize);
		}
		
		// Seta o frame do movieclip, cada peça pode ser branca ou preta.
		public function setFrame():void
		{
			gotoAndStop(this.pieceColor);
		}
		
		public function up(steps:int):void
		{
			for(var i:int = (this.row - 1); i >= (this.row - steps); i--)
			{
				if(i < 0)
					break;
					
				if(!checkPossibleMove(i, this.column))
					break;
			}
		}

		public function down(steps:int):void
		{
			for(var i:int = (this.row + 1); i <= (this.row + steps); i++)
			{
				if(i > 7)
					break;
					
				if(!checkPossibleMove(i, this.column))
					break;
			}
		}

		public function left(steps:int):void
		{
			for(var j:int = (this.column - 1); j >= (this.column - steps); j--)
			{
				if(j < 0)
					break;
					
				if(!checkPossibleMove(this.row, j))
					break;
			}
		}
		
		public function right(steps:int):void
		{
			for(var j:int = (this.column + 1); j <= (this.column + steps); j++)
			{
				if(j > 7)
					break;
				
				if(!checkPossibleMove(this.row, j))
					break;
			}
		}
		
		public function diagonalDown(steps:int):void
		{
			var pos:int = this.row + 1;
			var finalPos:int = this.row + steps;
			var i:int = 1;
			
			while(pos <= finalPos)
			{
				if((this.row + i) > 7 || (this.column + i) > 7)
						break;
				
				if(!checkPossibleMove((this.row + i), (this.column + i)))
						break;
				
				i++;
				pos++;
			}
			
			pos = this.row + 1;
			i = 1;
			
			while(pos <= finalPos)
			{
				if((this.row + i) > 7 || (this.column - i) < 0)
						break;
						
				if(!checkPossibleMove((this.row + i), (this.column - i)))
						break;
				
				i++;
				pos++;
			}
		}
		
		public function diagonalUp(steps:int):void
		{
			var pos:int = this.row - 1;
			var finalPos:int = this.row - steps;
			var i:int = 1;
			
			while(pos >= finalPos)
			{
				if((this.row - i) < 0 || (this.column + i) > 7)
						break;
				
				if(!checkPossibleMove((this.row - i), (this.column + i)))
						break;
				
				i++;
				pos--;
			}
			
			pos = this.row - 1;
			i = 1;
			
			while(pos >= finalPos)
			{
				if((this.row - i) < 0 || (this.column - i) < 0)
						break;
						
				if(!checkPossibleMove((this.row - i), (this.column - i)))
						break;
				
				i++;
				pos--;
			}		
		}
		
		// Checa se existe alguma peça no caminho do movimento.
		// 1- Se não houver o movimento está liberado.
		// 2- Se houver e for uma peça do próprio jogador, bloqueia o movimento.
		// 3- Se houver e for uma peça adversária, permite o movimento mas bloqueia o restante deles.
		public function checkPossibleMove(i:int, j:int):Boolean
		{
			if (currentBoard[i][j] == null) 
			{
				positions.push( new Point(i,j) );
			} 
			else 
			{
				if (this.pieceColor != currentBoard[i][j].pieceColor) 
				{
					positions.push( new Point(i,j) );
				}
				
				return false;
			}
			
			return true;
		}

	}
	
}
